package com.msf.tutorial.java8.chapter7;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 使用流
 *
 * 流的扁平化
 *
 * 计算列表中各不相同的字符
 */
public class C02FlatMap {

    /**
     * 第一个版本
     *
     * 结果打印出四个数据
     *
     * 这是因为传递给map方法的 Lambda 为每个单词返回了一个 String[]
     *
     * 所以 map 方法后，得到的是一个 Stream<String[]> 而不是预想的 Stream<String>
     */
    public static void status_1() {
        List<String> list = Arrays.asList("Java 8", "Lambdas", "In", "Action");
        list.stream()
            .map(word -> word.split(""))
            .distinct()
            .collect(Collectors.toList())
            .forEach(System.out::println);
    }

    /**
     * 第二个版本
     *
     * 使用 Arrays.stream() 将 字符串数组流 转换为 字符串流
     */
    public static void status_2() {
        List<String> list = Arrays.asList("Java 8", "Lambdas", "In", "Action");
        list.stream()
            .map(word -> word.split(""))
            .map(Arrays::stream)
            .distinct()
            .collect(Collectors.toList())
            .forEach(System.out::println);
    }

    /**
     * 第三个版本
     *
     * 使用 flatMap
     *
     * 使用 flatMap 方法的效果是，各个数组并不是分别映射成一个流，而是映射成流的内容
     */
    public static void status_3() {
        List<String> list = Arrays.asList("Java 8", "Lambdas", "In", "Action");
        list.stream()
                .map(word -> word.split(""))
                .flatMap(Arrays::stream)
                .distinct()
                .collect(Collectors.toList())
                .forEach(System.out::print);
    }


    public static void main(String[] args) {
        System.out.println("========= 第一个版本 ===========");
        status_1();

        System.out.println("========= 第二个版本 ===========");
        status_2();

        System.out.println("========= 第三个版本 ===========");
        status_3();

    }

}
